package com.guonl.utils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ListUtils {

    /**
     * funcKey选出key，value是对象列表
     */
    public static <T, KEY> Map<KEY, List<T>> toMapList(List<T> list, Function<T, KEY> funcKey) {
        if (CollectionUtils.isNotEmpty(list)) {
            return list.stream().collect(Collectors.groupingBy(funcKey));
        }
        return Maps.newHashMap();
    }

    /**
     * funcKey选出key，value是对象本身(去重)
     */
    public static <T, KEY> Map<KEY, T> toMap(List<T> list, Function<T, KEY> funcKey) {
        if (CollectionUtils.isNotEmpty(list)) {
            return list.stream().collect(Collectors.toMap(
                    funcKey,                // key
                    Function.identity(),    // value就是对象本身
                    (obj1, obj2) -> obj1    // 如果重复，则value选第一个出现的
            ));
        }
        return Maps.newHashMap();
    }

    /**
     * funcKey选出key，funcValue选出value(去重)
     * 这里VALUE对象也可以是另一个复杂对象
     */
    public static <T, KEY, VALUE> Map<KEY, VALUE> toMap(List<T> list, Function<T, KEY> funcKey, Function<T, VALUE> funcValue) {
        if (CollectionUtils.isNotEmpty(list)) {
            return list.stream().collect(Collectors.toMap(
                    funcKey,                // key
                    funcValue,              // value
                    (obj1, obj2) -> obj1    // 如果重复，则value选第一个出现的
            ));
        }
        return Maps.newHashMap();
    }

    public static <T, R> List<R> toList(List<T> list, Function<T, R> function) {
        if (CollectionUtils.isEmpty(list)) {
            return Lists.newArrayList();
        }
        return list.stream().map(function).collect(Collectors.toList());
    }

    public static <T, R> List<R> toListUnique(List<T> list, Function<T, R> function) {
        if (CollectionUtils.isEmpty(list)) {
            return Lists.newArrayList();
        }
        return list.stream().map(function).distinct().collect(Collectors.toList());
    }
}
